package com.jarveis.frame.lang;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.log4j.Logger;

/**
 * 日期工具类
 * 
 * @author liuguojun
 */
public class DateUtil {

	private static final Logger logger = Logger.getLogger(DateUtil.class);

	// 默认的一个天为24小时,以秒为基数
	public static final long DAY_SECOND = 86400L;

	// 默认的一个月为30天,以秒为基数
	public static final long MONTH_SECOND = 2592000L;

	// 默认的一个月为30天,以秒为基数
	public static final long YEAR_SECOND = 946080000L;
	// 默认的一个天为24小时,以毫秒为基数
	public static final long DAY_MILLISECOND = 86400000L;

	// 默认的一个月为30天,以秒为基数
	public static final long MONTH_MILLISECOND = 2592000000L;

	// 默认的一个月为30天,以秒为基数
	public static final long YEAR_MILLISECOND = 946080000000L;

	// 有符号的年月格式
	public static final String FORMAT_YM = "yyyy-MM";

	// 有符号的年月日格式
	public static final String FORMAT_YMD = "yyyy-MM-dd";

	// 有符号的年月日时分秒格式
	public static final String FORMAT_YMDHMS = "yyyy-MM-dd HH:mm:ss";

	// 无符号的年月日时分秒格式
	public static final String FORMAT_YMDHMSS = "yyyyMMddHHmmssSSS";

	/**
	 * 获取当前日期
	 * 
	 * <pre>
	 * String dateStr = DateUtil.getDateStr();
	 * ......
	 * </pre>
	 * 
	 * @return String
	 */
	public static String getDateStr() {
		return getDateStr(getDate(), "yyyy-MM-dd");
	}

	/**
	 * 获取指定日期并返回指定格式的字符串
	 * 
	 * <pre>
	 * String dateStr = DateUtil.getDateStr(DateUtil.getDate(), "yyyy/MM/dd");
	 * ......
	 * </pre>
	 * 
	 * @param date
	 *            日期
	 * @param pattern
	 *            返回的日期字符串格式
	 * @return String
	 */
	public static String getDateStr(Date date, String pattern) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return dateFormat.format(calendar.getTime());
	}

	/**
	 * 获取当前日期
	 * 
	 * <pre>
	 * Date date = DateUtil.getDate();
	 * ......
	 * </pre>
	 * 
	 * @return Date
	 */
	public static Date getDate() {
		Calendar calendar = Calendar.getInstance();
		return calendar.getTime();
	}

	/**
	 * 获取给定字符串的日期对象
	 * 
	 * <pre>
	 * Date date = DateUtil.getDate("2011/01/01", "yyyy/MM/dd");
	 * ......
	 * </pre>
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param pattern
	 *            日期格式
	 * @return Date
	 * @throws ParseException
	 */
	public static Date getDate(String dateStr, String pattern) {
		SimpleDateFormat dateFormat = new SimpleDateFormat();
		dateFormat.applyPattern(pattern);
		Date date = null;
		try {
			date = dateFormat.parse(dateStr);
		} catch (ParseException ex) {
			logger.error(ex.getMessage(), ex);
		}

		return date;
	}

	/**
	 * 以当前日期为参考，并获取当前日期之前或之后的日期
	 * 
	 * @param type
	 * @param num
	 * @return
	 */
	public static Date getLast(final int dt, int num) {
		Calendar calendar = Calendar.getInstance();
		calendar.add(dt, num);
		return calendar.getTime();
	}

	/**
	 * 以指定日期为参考，并获取指定日期之前或之后的日期
	 * 
	 * <pre>
	 * Date lastMonth = DateUtil.getLast(DateUtil.getDate(), Calendar.MONTH, 1);
	 * </pre>
	 * 
	 * @param date
	 * @param dt
	 * @param num
	 * @return String
	 */
	public static Date getLast(Date date, final int dt, int num) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(dt, num);
		return calendar.getTime();
	}

	/**
	 * 把java.util.Date转化为java.sql.Date
	 * 
	 * @param date
	 * @return java.sql.Date
	 */
	public static java.sql.Date convert(java.util.Date date) {
		return new java.sql.Date(date.getTime());
	}

	/**
	 * 把java.sql.Date转化为java.util.Date
	 * 
	 * @param date
	 * @return java.util.Date
	 */
	public static java.util.Date convert(java.sql.Date date) {
		return new java.util.Date(date.getTime());
	}

	/**
	 * 获取当前的年
	 * 
	 * <pre>
	 * int year = DateUtil.getYear();
	 * ......
	 * </pre>
	 * 
	 * @return int
	 */
	public static int getYear() {
		Calendar calendar = Calendar.getInstance();
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 获取给定日期的年
	 * 
	 * <pre>
	 * int year = DateUtil.getYear(DateUtil.getDate());
	 * ......
	 * </pre>
	 * 
	 * @param date
	 * @return int
	 */
	public static int getYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 比较两个日期的大小
	 * 
	 * <pre>
	 * DateUtil.compare(&quot;2010-12-31&quot;, &quot;2011-01-01&quot;) = -1;
	 * DateUtil.compare(&quot;2011-01-01&quot;, &quot;2011-01-01&quot;) = 0;
	 * DateUtil.compare(&quot;2011-01-02&quot;, &quot;2011-01-01&quot;) = 1;
	 * </pre>
	 * 
	 * @param date1
	 * @param date2
	 * @return int
	 */
	public static int compare(Date date1, Date date2) {
		return date1.compareTo(date2);
	}

	/**
	 * 验证当前所在的年份是否为闰年
	 * 
	 * @return boolean
	 */
	public static boolean isLeapYear() {
		return isLeapYear(getYear());
	}

	/**
	 * 验证指定的年份是否为闰年
	 * 
	 * @param year
	 * @return boolean
	 */
	public static boolean isLeapYear(int year) {
		if (year % 100 == 0) {
			if (year % 400 == 0) {
				return true;
			} else {
				return false;
			}
		} else if (year % 4 == 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 获取指定月份有多少天
	 * 
	 * <pre>
	 * int days = DateUtil.getMonthDays(1);
	 * ......
	 * </pre>
	 * 
	 * @param month
	 * @return int
	 */
	public static int getMonthDays(int month) {
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
				|| month == 10 || month == 12) {
			return 31;
		} else if (month == 4 || month == 6 || month == 9 || month == 11) {
			return 30;
		} else {
			if (isLeapYear()) {
				return 29;
			} else {
				return 28;
			}
		}
	}

	/**
	 * 获取当前月份有多少天
	 * 
	 * <pre>
	 * int days = DateUtil.getMonthDays();
	 * ......
	 * </pre>
	 * 
	 * @return int
	 */
	public static int getMonthDays() {
		Calendar calendar = Calendar.getInstance();
		int month = calendar.get(Calendar.MONTH) + 1;
		return getMonthDays(month);
	}

	/**
	 * 从字符串中查找出日期
	 * 
	 * @param str
	 * @return
	 */
	public static String seekDate(String str) {
		String dateStr = "";

		String[] strs = StringUtil.find(str, "\\d+\\-\\d+\\-\\d+");
		if (strs.length > 0) {
			dateStr = getDateStr(getDate(strs[0], "yyyy-MM-dd"), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "\\d+\\-\\d+");
		if (strs.length > 0) {
			dateStr = getYear() + "-" + strs[0];
			dateStr = getDateStr(getDate(dateStr, "yyyy-MM-dd"), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "\\d+/\\d+/\\d+");
		if (strs.length > 0) {
			dateStr = getDateStr(getDate(strs[0], "yyyy/MM/dd"), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "\\d+/\\d+");
		if (strs.length > 0) {
			dateStr = getYear() + "/" + strs[0];
			dateStr = getDateStr(getDate(dateStr, "yyyy/MM/dd"), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "\\d+年\\d+月\\d+日");
		if (strs.length > 0) {
			dateStr = getDateStr(getDate(strs[0], "yyyy年MM月dd日"), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "\\d+月\\d+日");
		if (strs.length > 0) {
			dateStr = getYear() + "年" + strs[0];
			dateStr = getDateStr(getDate(dateStr, "yyyy年MM月dd日"), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "\\d+\\s?分钟前");
		if (strs.length > 0) {
			dateStr = getDateStr(getDate(), "yyyyMMdd");
			return dateStr;
		}
		
		strs = StringUtil.find(str, "\\d+\\s?小时前");
		if (strs.length > 0) {
			dateStr = getDateStr(getDate(), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "今天\\s?\\d+");
		if (strs.length > 0) {
			dateStr = getDateStr(getDate(), "yyyyMMdd");
			return dateStr;
		}

		strs = StringUtil.find(str, "昨天\\s?\\d+");
		if (strs.length > 0) {
			dateStr = getDateStr(getLast(Calendar.DATE, -1), "yyyyMMdd");
			return dateStr;
		}
		
		strs = StringUtil.find(str, "前天\\s?\\d+");
		if (strs.length > 0) {
			dateStr = getDateStr(getLast(Calendar.DATE, -2), "yyyyMMdd");
			return dateStr;
		}

		return dateStr;
	}

	public static void main(String[] args) {
		String dateStr = "";
//		dateStr = seekDate("张学元 6-1 11:18 没有评论");
//		dateStr = seekDate("张学元 06-02 11:18 没有评论");
//		dateStr = seekDate("2014-6-3, 11:13 | 黄思俊");
//		dateStr = seekDate("张学元 2014-06-04 11:18 没有评论");

//		dateStr = seekDate("张学元 6/1 11:18 没有评论");
//		dateStr = seekDate("张学元 06/02 11:18 没有评论");
//		dateStr = seekDate("2014/6/3, 11:13 | 黄思俊");
//		dateStr = seekDate("张学元 2014/06/04 11:18 没有评论");

//		dateStr = seekDate("张学元 6月1日 11:18 没有评论");
//		dateStr = seekDate("张学元 06月02日 11:18 没有评论");
//		dateStr = seekDate("2014年6月3日, 11:13 | 黄思俊");
//		dateStr = seekDate("张学元 2014年06月04日 11:18 没有评论");

//		dateStr = seekDate("22分钟前");
		dateStr = seekDate("22小时前");
//		dateStr = seekDate("今天 14:00");
//		dateStr = seekDate("昨天15:08");
//		dateStr = seekDate("前天15:08");

		logger.info(dateStr);

	}
}
